/*!
 *  \file       GaussianNoise.cpp
 *  \brief      Implementazione della classe \c GaussianNoise
 *  \author     Davide Scola <S2299453@studenti.unige.it>
 *  \author	Minetti Alberto <S3064777@studenti.unige.it>
 *  \version    1.0
 *
 */
#include "IEntropyGenerator.hpp"

#include "IRandomGenerator.hpp"
#include "SimpleRandomGenerator.hpp"
#include "NormalizedRandomGenerator.hpp"
#include "IntervalRandomGenerator.hpp"
#include "GaussRandomGenerator.hpp"

#include "ISignalNoise.hpp"
#include "GaussianNoise.hpp"

using namespace std;


/*!
 *  \brief	Costruttore della classe \c GaussianNoise
 *  \param[in]	mean		media della gaussiana
 *  \param[in]	variance	varianza della gaussiana
 *  \param[in]	entropy		generatore di entropia da utilizzare
 *
 *  \see	GaussianNoise< tType >::GaussianNoise( GaussianNoise< tType > const& other )
 */
template< class tType >
GaussianNoise< tType >::GaussianNoise( tType mean, tType variance, IEntropyGenerator & entropy )
    : random_( GaussRandomGenerator< tType >( mean, variance, entropy ) )
{
}

/*!
 *  \brief      Costruttore di copia della classe \c GaussianNoise
 *  \param[in]	other	generatore da copiare
 *
 *  \see	GaussianNoise< tType >::GaussianNoise( tType mean, tType variance, IEntropyGenerator & entropy )
 */
template< class tType >
GaussianNoise< tType >::GaussianNoise( GaussianNoise< tType > const& other )
    : random_( (&other)->random_ )
{
}


/*!
 *  \brief      Operatore di assegnazione della classe \c GaussianNoise
 */
template < typename tType > GaussianNoise< tType >&
GaussianNoise< tType >::operator=( const GaussianNoise& other )
{
   if (this == &other) {
       return *this;
   }
   
   this->random_ = (&other)->random_;
   return *this;
}


/*!
 *  \brief      Generatore del rumore
 *  \return	ritorna il valore corrente del segnale perturbato con una gaussiana
 */
template< class tType > tType
GaussianNoise< tType >::operator() ( tType currPoint )
{
  return currPoint + this->random_.next();
}
